#include "gestionnairemaillages.h"

//-----------------------------------------------------Constructeurs et destructeurs-----------------------------------------------------//

//---------------------------------------------------------------Méthodes----------------------------------------------------------------//
/*************************************************************************************
 * On charge un nouvel objet de scène à partir d'un fichier OFF                      *
 * @param chemin : le chemin du fichier OFF                                          *
 * @return ObjetScene : l'objet de la scène chargé à partir du fichier OFF           *
 *************************************************************************************/
ObjetScene& GestionnaireMaillages::chargerFichierOFF(QString chemin)
{
    ObjetScene *objet = new ObjetScene();

    QFile fichier(chemin);
    if (!fichier.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        throw std::string("GestionnaireMaillages.chargerFichierOFF : erreur, impossible d'ouvrir le fichier");
    }

    QTextStream flux(&fichier);
    QString ligne = "";

    //On lit la première ligne du fichier, on vérifie que c'est un fichier OFF
    if(!flux.atEnd())
    {
        ligne = flux.readLine();

        if(ligne != "OFF")
        {
            throw std::string("GestionnaireMaillages.chargerFichierOFF : erreur, le fichier n'est pas un fichier OFF correct");
        }
    }

    //On lit la ligne contenant le nombre de sommet et le nombre de facettes
    int nbSommets = 0;
    int nbFacettes = 0;
    int nbAretes;

    if(!flux.atEnd())
    {
        flux >> nbSommets;
        flux >> nbFacettes;
        flux >> nbAretes;
    }
    
    //On charge la liste des points
    //On récupère le maximum pour remettre l'objet entre 0 et 1
    QList<Point*> listePoint;
    GLfloat max = 0.0;

    for(int i = 0; i < nbSommets; ++i)
    {
        if(!flux.atEnd())
        {
            GLfloat x, y, z;
            flux >> x;
            flux >> y;
            flux >> z;

            //On met à jour le maximum
            if(fabs(x) > max)
                max = x;

            if(fabs(y) > max)
                max = y;

            if(fabs(z) > max)
                max = z;

            listePoint.push_back(new Point(x, y, z));
        }
    }

    //On met à jour les coordonnées  des points relativement au maximum
    for(int i = 0; i < listePoint.size(); ++i)
    {
        Point* p = new Point(max, max, max);
        *listePoint[i]/= *p;
    }

    //On charge les faces
    for(int i = 0; i < nbFacettes; ++i)
    {
        Face* face = new Face();

        if(!flux.atEnd())
        {
            int nbSommetsFace;
            flux >> nbSommetsFace;

            //On rajoute les sommets à la face en cours
            for(int j = 0; j < nbSommetsFace; ++j)
            {
                int indiceSommet;
                flux >> indiceSommet;

                face->ajouterSommet(*(new Sommet(*listePoint[indiceSommet], 0.0, 0.0)));
            }
            //On calcule les normales de la face et on rajoute celle-ci à l'objet.
            face->calculerNormale();
            objet->ajouterFace(*face);
        }
    }

    fichier.close();
    return *objet;
}

//---------------------------------------------------------------Accesseurs--------------------------------------------------------------//

//------------------------------------------------------Surcharge des opérateurs---------------------------------------------------------//


